package br.com.beans;

import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.dao.CidadeDAO;
import br.com.dao.EstadoDAO;
import br.com.dao.PacienteDAO;

/** Classe que representa um paciente  */
@Entity
@Table(name="tb_paciente")
public class Paciente {

	/** Id do paciente */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(nullable=false)
	private int id;
	
	/** Nome do paciente */
	@Column(length=50,nullable=false)
	private String nome;
	
	/** Endereco residencial */
	@Embedded
	private Endereco endereco = new Endereco();
	
	/** Data de nascimento */
	@Temporal(value=TemporalType.DATE)
	@Column(nullable=false)
	private Date nascimento;
	
	/** Telefone residencial */
	@Column(length=20,nullable=true)
	private String telefone;

	/** Telefone comercial */
	@Column(length=20,nullable=true)
	private String telefoneCom;

	/** Telefone celular */
	@Column(length=20,nullable=true)
	private String telefoneCel;
	
	/** Lista de itens de prontuario */
	@OneToMany(fetch=FetchType.EAGER)
	private Set<Prontuario> itensProntuario = new TreeSet<Prontuario>();
	
	/** Construtor padrao */
	public Paciente() {}

	/** Construtor de copia */
	public Paciente(Paciente paciente) {
		copiar(paciente);
	}

	/** Limpa todos atributos. */
	public void limpar() {
		setId(0);
		setEndereco(new Endereco());
		setNascimento(null);
		setNome(null);
		setTelefone(null);
		setTelefoneCom(null);
		setTelefoneCel(null);
		itensProntuario.clear();
	}
	
	/** Copia atributos de outro objeto.
	 *  @param obj Objeto a ser copiado */
	public void copiar(Paciente obj) {
		if (obj != null) {
			//id          = obj.id;
			nome        = obj.nome;
			endereco    = new Endereco(obj.endereco);
			nascimento  = obj.nascimento;
			telefone    = obj.telefone;
			telefoneCom = obj.telefoneCom;
			telefoneCel = obj.telefoneCel;
			itensProntuario.clear();
			itensProntuario.addAll(obj.itensProntuario);
		} else {
			limpar();
		}
	}

	/** Cadastra um paciente. */
	public void cadastrar() {
		PacienteDAO pacienteDAO = new PacienteDAO();
		EstadoDAO estadoDAO = new EstadoDAO();
		CidadeDAO cidadeDAO = new CidadeDAO();
		FacesMessage facesMessage = null;

		Estado estadoObj = estadoDAO.localizar(getEndereco().getEstado().getNome());
		Cidade cidadeObj = cidadeDAO.localizar(getEndereco().getCidade().getNome());
		
		Endereco enderecoObj = getEndereco();
		if (estadoObj != null) enderecoObj.setEstado(estadoObj);
		if (cidadeObj != null) enderecoObj.setCidade(cidadeObj);

		setEndereco(enderecoObj);
		
		if (pacienteDAO.inserir(this)) {
			facesMessage = new FacesMessage("Paciente adicionado com sucesso.",null);  
			limpar();
		} else {
			facesMessage = new FacesMessage("Erro ao adicionar paciente.",null);  
		}
		FacesContext.getCurrentInstance().addMessage(null,facesMessage);  
	}
	
	/** Remove um paciente. */
	public void remover() {
		PacienteDAO pacienteDAO = new PacienteDAO();
		FacesMessage facesMessage = null;

		if (pacienteDAO.excluir(getId())) {
			facesMessage = new FacesMessage("Paciente removido com sucesso.",null);  
		} else {
			facesMessage = new FacesMessage("Erro ao remover paciente.",null);  
		}
		limpar();
		FacesContext.getCurrentInstance().addMessage(null,facesMessage);  
	}

	/** Consulta um paciente cadastrado e copia para este objeto. */
	public void consultar() {
		PacienteDAO pacienteDAO = new PacienteDAO();
		
		Paciente pacienteObj = pacienteDAO.localizar(getNome());
		if (pacienteObj != null) {
			copiar(pacienteObj);
		} else {
			limpar();
		}
	}
	
	/** Retorna lista de pacientes.
	 *  @return Lista de pacientes. */
	public List<Paciente> getLista() {
		PacienteDAO pacienteDAO = new PacienteDAO();
		return pacienteDAO.listar();
	}
	
	/** Retorna lista de nomes de pacientes.
	 *  @return Lista de nomes de pacientes. */
	public Set<String> getListaNome() {
		PacienteDAO pacienteDAO = new PacienteDAO();
		Set<String> resultado = new TreeSet<String>();

		List<Paciente> pacienteList = pacienteDAO.listar();
		if (pacienteList != null) {
			for (Paciente paciente : pacienteList){
				resultado.add(paciente.getNome());
			}
		}
		return resultado;
  }
  
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public Date getNascimento() {
		return nascimento;
	}

	public void setNascimento(Date nascimento) {
		this.nascimento = nascimento;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getTelefoneCom() {
		return telefoneCom;
	}

	public void setTelefoneCom(String telefoneCom) {
		this.telefoneCom = telefoneCom;
	}

	public String getTelefoneCel() {
		return telefoneCel;
	}

	public void setTelefoneCel(String telefoneCel) {
		this.telefoneCel = telefoneCel;
	}

	public void setItensProntuario(Set<Prontuario> itensProntuario) {
		this.itensProntuario = itensProntuario;
	}

	public Set<Prontuario> getItensProntuario() {
		return itensProntuario;
	}
	
}
